package main

import "fmt"

type Profile struct {
	name   string
	age    int
	gender string
	mother *Profile
	father *Profile
}

//定义一个和 Profile 绑定的方法; 注意这个方法和普通的方法是有区别的
func (person Profile) fmtProfile() {
	fmt.Printf("名字：%s\n", person.name)
	fmt.Printf("年龄：%d\n", person.age)
	fmt.Printf("性别：%s\n", person.gender)
}

//注意*, 使用指针作为方法的接收者;对象进行操作
//你需要在方法内部改变结构体内容的时候
//出于性能的问题，当结构体过大的时候
func (person *Profile) increaseAge(num int) {
	person.age += num
}

type company struct {
	companyName string
	companyAddr string
}

type staff struct {
	name     string
	age      int
	gender   string
	position string
	company  //匿名字段
}

//使用组合代替继承
func compose() {
	myCompany := company{
		companyName: "明源云",
		companyAddr: "深圳南山区",
	}

	guohao := staff{
		name:     "郭豪",
		age:      0,
		gender:   "男",
		position: "Java 开发",
		company:  myCompany,
	}
	fmt.Printf("%s 在 %s 工作 \n", guohao.name, myCompany.companyName)
	fmt.Printf("%s 在 %s 工作 \n", guohao.name, guohao.company.companyName)

}

func main() {
	myself := Profile{name: "GuoH", age: 18, gender: "男"}
	myself.fmtProfile()
	fmt.Printf("Mysel 的年龄为: %d \n", myself.age)
	myself.increaseAge(5)
	fmt.Printf("Mysel 长大后的年龄为: %d \n", myself.age)
	compose()
}
